package com.baizhi.service.impl;

import com.baizhi.entity.BzAdmin;
import com.baizhi.service.BzRoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.Set;

@Slf4j
@Service("ss")
public class PermissionService {
    @Autowired
    private BzRoleService roleService;

    /**
     * 校验权限  校验单个权限
     */
    public boolean hasRole(String role) {
        return hasAnyRole(role);
    }

    /**
     * 校验角色 只要参数中任意一个角色校验成功就return true
     */
    public boolean hasAnyRole(String... roles) {

//        通过用户名查询数据库 得到当前用户所有的角色
        Set<String> roleSet = roleService.getRolesByUsername(getUsername());
        log.info("查询数据库中：{}的角色信息：{}",getUsername(),roleSet);
//        校验注解中的角色 在set是否存在
        for (String role : roles) {
            if (roleSet.contains(role)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 校验权限  校验单个权限
     */
    public boolean hasPermission(String permission) {
        return hasAnyPermission(permission);
    }

    /**
     * 校验权限  只要参数中任意一个权限校验成功就return true
     */
    public boolean hasAnyPermission(String... permissions) {
//        通过用户名查询数据库 得到当前用户所有的权限
        Set<String> permissionSet = roleService.getPermissionsByUsername(getUsername());
        log.info("查询数据库中：{}的权限信息：{}",getUsername(),permissionSet);

//        校验注解中的权限在set是否存在
        for (String permission : permissions) {
            if (permissionSet.contains(permission)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 获取当前认证的用户的用户名
     */
    public String getUsername(){
        /**
         * SecurityContextHolder 获取Security相关的数据 包含用户对象
         */
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        BzAdmin principal = (BzAdmin) authentication.getPrincipal();
        return principal.getUsername();
    }
}
